"""
ConnLLM V2 网络搜索处理器
处理网络搜索相关的请求和响应
"""

from typing import Dict, Any, List, Optional
import logging

from .base import RequestProcessor

logger = logging.getLogger("connllm.core_v2.processors.web_search")

class WebSearchProcessor(RequestProcessor):
	"""网络搜索处理器"""
	
	def __init__(self, web_search_capability):
		"""
		初始化处理器
		
		Args:
			web_search_capability: 网络搜索能力组件
		"""
		self.capability = web_search_capability
	
	def process_request(self, params: Dict[str, Any], context: Dict[str, Any]) -> Dict[str, Any]:
		"""
		处理请求参数，添加搜索工具
		
		Args:
			params: 请求参数
			context: 请求上下文
			
		Returns:
			处理后的请求参数
		"""
		if not self.capability.is_supported():
			return params
			
		# 如果上下文中已经进行过搜索，不再添加搜索工具
		if context.get("search_performed", False):
			logger.debug("已经进行过搜索，跳过添加搜索工具")
			return params
		
		# 添加搜索工具
		modified_params = self.capability.prepare_request(params)
		
		# 标记已添加搜索工具
		context["search_tools_added"] = True
		
		return modified_params
	
	def process_response(self, response: Any, context: Dict[str, Any]) -> Any:
		"""
		处理响应，检查是否需要进行搜索
		
		Args:
			response: API响应
			context: 请求上下文
			
		Returns:
			处理后的响应
		"""
		# 如果没有添加搜索工具，直接返回
		if not context.get("search_tools_added", False):
			return response
			
		# 如果已经进行过搜索，直接返回
		if context.get("search_performed", False):
			return response
			
		# 检查是否有搜索调用
		search_calls = self.capability.detect_search_calls(response)
		
		# 如果有搜索调用，保存到上下文中
		if search_calls:
			logger.debug(f"检测到{len(search_calls)}个搜索调用")
			context["search_calls"] = search_calls
			context["original_response"] = response
			
			# 执行搜索调用
			search_results = self.capability.execute_search_calls(search_calls)
			context["search_results"] = search_results
			context["search_performed"] = True
		
		return response
	
	def should_retry_request(self, response: Any, context: Dict[str, Any]) -> bool:
		"""
		检查是否需要重试请求
		
		Args:
			response: API响应
			context: 请求上下文
			
		Returns:
			是否需要重试
		"""
		# 如果有搜索结果，需要重试请求
		return (
			context.get("search_tools_added", False) and 
			context.get("search_results", None) is not None and 
			not context.get("retry_with_search", False)
		)
